<html>
<head>
    <style type="text/css">
        .pass { color: green; }
        .fail { color: red; }
    </style>
    <script>
        function printOut(msg)
        {
            var console = document.getElementById("console");
            var span = document.createElement('span');
            span.innerHTML = msg + '<br>';
            console.appendChild(span);
        }

        function resultStringifier(result)
        {
            if (result === "")
                return "<b>the empty string</b>";
            else if (result === null)
                return "<b>null</b>";
            else if (result === "null")
                return "<b>'null'</b>";
            else if (result === undefined)
                return "<b>undefined</b>";
            return "the string '" + result + "'";
        }

        function nullTestDocumentAttribute(documentType, doc, attr, expected, expectedExceptionCode)
        {
            var result;
            try {
                doc[attr] = null;
                if (expectedExceptionCode != undefined)
                    result = "<span class='fail'>TEST FAILED:</span> Should've thrown " + expectedExceptionCode + " but threw nothing.";
                else if (doc[attr] === expected)
                    result = "<span class='pass'>TEST SUCCEEDED:</span> The value was " + resultStringifier(expected) + ".";
                else
                    result = "<span class='fail'>TEST FAILED:</span> The value should have been " + resultStringifier(expected) + " but was " + resultStringifier(doc[attr]) + ".";

            } catch (ex) {
                if (ex.code == expectedExceptionCode)
                    result = "<span class='pass'>TEST SUCCEEDED:</span> Got the expected exception (" + ex.code + ").";
                else
                    result = "<span class='fail'>TEST FAILED:</span> Should've thrown " + expectedExceptionCode + " but threw " + ex.code + ".";
            }

            result += " [tested " + documentType + "." + attr + "]";
            printOut(result);
        }

        function runTests()
        {
            if (window.testRunner)
                testRunner.dumpAsText();

            // Others to test:
            //  Functions

            var xmlDoc = document.implementation.createDocument(null, null, null);
            var htmlDoc = document.implementation.createHTMLDocument('A Title');
            htmlDoc.body = htmlDoc.createElement('body');

            var listing = [
                {
                    typeName: 'Document',
                    docToUse: xmlDoc,
                    attributes: [
                        {name: 'xmlVersion', expectedExceptionCode: 9},
                        {name: 'documentURI', expectedNull: 'about:blank'},
                        {name: 'charset', expectedNull: 'UTF-8'},
                        {name: 'characterSet', expectedNull: 'UTF-8'},
                        {name: 'inputEncoding', expectedNull: 'UTF-8'}
                    ]
                },
                {
                    typeName: 'HTMLDocument',
                    docToUse: htmlDoc,
                    attributes: [
                        {name: 'title', expectedNull: 'null'},
                        {name: 'cookie', expectedNull: ''},
                        {name: 'bgColor', expectedNull: ''},
                        {name: 'fgColor', expectedNull: ''},
                        {name: 'alinkColor', expectedNull: ''},
                        {name: 'linkColor', expectedNull: ''},
                        {name: 'vlinkColor', expectedNull: ''},
                        {name: 'dir', expectedNull: ''},
                        {name: 'designMode', expectedNull: 'off'}
                    ]
                }
            ];

            for (doc in listing) {
                var typeName = listing[doc].typeName;
                var docToUse = listing[doc].docToUse;
                var attrs = listing[doc].attributes;
                for (attr in attrs) {
                    nullTestDocumentAttribute(typeName, docToUse, attrs[attr].name, attrs[attr].expectedNull, attrs[attr].expectedExceptionCode);
                }
                printOut('');
            }
        }
    </script>
</head>
<body onload="runTests()">
    <p>This test setting various attributes of documents to JavaScript null.</p>
    <div id="console"></div>
</body>
</html>
